//https://dart.cn/language/#classes
/**
下面的示例中展示了一个包含三个属性、两个构造函数以及一个方法的类。
其中一个属性不能直接赋值，因此它被定义为一个 getter 方法（而不是变量）。
该方法使用字符串插值来打印字符串文字内变量的字符串。 */

class Spacecraft {
  String name;
  DateTime? launchDate;


  int? get launchYear => launchDate?.year;

  Spacecraft(this.name, this.launchDate) {
    
  }

  Spacecraft.unlaunched(String name) : this(name, null);


  void describe() {
    print('Spacecraft: $name');

    var launchDate = this.launchDate;
    if (launchDate != null) {
      int years = DateTime.now().difference(launchDate).inDays ~/ 365;
      print('Launched: $launchYear ($years years ago)');
    } else {
      print('Unlaunched');
    }
  }
}

void main() {
  var voyager = Spacecraft('Voyager I', DateTime(1977, 9, 5));
  voyager.describe();

  var voyager3 = Spacecraft.unlaunched('Voyager III');
  voyager3.describe();
}